Value Objectパターン(『テスト駆動開発』)
「広く共有されるものの、同一インスタンスであることはさほど重要でないオブジェクト (Kindle の位置No.4062-4063)」を設計するパターン
オブジェクト作成時に状態を設定したら、その後決して変えないようにする。オブジェクトへの操作は必ず新しいオブジェクトを返す (Kindle の位置No.4063-4065)
不変なオブジェクトとなる
2つのオブジェクトが第3のオブジェクトを共有しているときに、どちらかが共有オブジェクトに変更を加えたら、もう1つのオブジェクトはもう共有オブジェクトの状態を信頼できない。(Kindle の位置No.4072-4074)
別名参照問題の回避方法
依存しているオブジェクトを渡すときは代わりにコピーを渡す
Observerパターン
オブジェクトへの依存を明示的に登録し、状態が変更されたら通知が来るようにする (Kindle の位置No.4077-4078)
処理フローを追いにくいとのこと
オブジェクトをオブジェクト未満のものとして扱う (Kindle の位置No.4079)
オブジェクトから「いつでも変更されうる」を取り除く
この回避方法を適用した結果として、不変になる
手元のオブジェクトの状態が変更されないことを知っているなら、別名参照は問題ではなくなる (Kindle の位置No.4081-4082)
Value Objectパターンの実装について
元のオブジェクトの状態を変えないために、すべての操作は新しいオブジェクトを返す必要がある。(Kindle の位置No.4090-4091)
コードの書き手はValue Objectを使っていることを意識
等価性比較(とハッシュ化)